約 4,616,566 件
https://w.atwiki.jp/cepgs/pages/2.html
メニュー Clan CEP TOP About us Join us Member List Movie Record Record-TF2 Member-Only Today - Yesterday - Total - ここを編集
https://w.atwiki.jp/sims2/pages/7.html
https://w.atwiki.jp/snesspec/pages/18.html
SNES には 8 ビットのデータバス 1 つと、2 つのアドレスバスがある。 アドレスバスはそれぞれ、"アドレスバスA"、"アドレスバスB" と呼ばれている。 データバス データバスは 8 ビット幅のバス。 データバスにデータがセットされていない時に読み込み動作を行うと、 最後にバスにセットされた値が代わりに読み込まれる。 これは、"オープンバス" と呼ばれている。 ライン カートリッジ 拡張 D0 19 11 D1 20 12 D2 21 13 D3 22 14 D4 50 15 D5 51 16 D6 52 17 D7 53 18 アドレスバス A アドレスバス A は 24 ビット幅のバスで、 読み込み・書き込みライン (/RD と /WR)、 2 つの補助ライン (/CART と /WRAM) を一緒に使う。 このバスは、カートリッジ端子のみではなく WRAM も接続されている。 ライン カートリッジ A0 17 A1 16 A2 15 A3 14 A4 13 A5 12 A6 11 A7 10 A8 9 A9 8 A10 7 A11 6 A12 37 A13 38 ライン カートリッジ A14 39 A15 40 A16 41 A17 42 A18 43 A19 44 A20 45 A21 46 A22 47 A23 48 /RD 23 /WR 54 /CART 49 /WRAM 32 アドレスバス B アドレスバス B は 8 ビット幅のバスで、 読み込み・書き込みライン (/RD と /WR) と一緒に使う。 カートリッジと拡張ポートだけではなく、 WRAM, PPU1, PPU2, APU もこのバスに接続されている。 ライン カートリッジ 拡張 PA0 28 1 PA1 59 2 PA2 29 3 PA3 60 4 PA4 30 5 PA5 61 6 PA6 3 7 PA7 34 8 /PARD 4 10 /PAWR 35 9
https://w.atwiki.jp/snesspec/pages/273.html
0x2180 - WMDATA (WRAMデータ読み書き) アクセスフラグ 読書バ強VH常 D7 D6 D5 D4 D3 D2 D1 D0 x x x x x x x x 0x2181 ~ 0x2183 でセットされた WRAM アドレスに対して 書き込み/読み込みを行います。 操作ごとにアドレスはインクリメントされます。 読み込み書き込みを組み合わせた場合、動作は不定になりますが、 論理的に動作すると思われます。 DMA で、WRAM からこのレジスタにアクセスすることはできず、 WRAM への書き込み操作は実行されません。 同様に、このレジスタから WRAM にアクセスすることはできず、 書き込まれる値は、オープンバスの値になります。 双方共に、0x2181 ~ 0x2183 はインクリメントされません。 0x2181 - WMADDL (WRAMアドレス (下位)) アクセスフラグ 読書下強VH常 D7 D6 D5 D4 D3 D2 D1 D0 x x x x x x x x 0x2182 - WMADDM (WRAMアドレス (中位)) アクセスフラグ 読書中強VH常 D7 D6 D5 D4 D3 D2 D1 D0 x x x x x x x x 0x2183 - WMADDH (WRAMアドレス (上位)) アクセスフラグ 読書上強VH常 D7 D6 D5 D4 D3 D2 D1 D0 x x x x x x x x ここには、0x2180 からアクセスされるアドレスを入れます。 WRAM は SNES メモリスペースの $7E 0000 ~ $7F FFFF と、 バンク 0x00 ~ 0x3F, 0x80 ~ 0xBF の 0x0000 から 0x1FFF にもマップされています。 いくつかのドキュメントで、これら 0x2181 ~ 0x2183 のレジスタは 書き込みだけでなく、読み込みもできるように書かれていますが、それは誤りです。 読み込み時にはオープンバスの値が返ります。 DMA で、WRAM からこれらのレジスタに対してアクセスはできませんが、 他の場合は DMA の書き込み動作が通常通り行われます。 これは、DMA で 0x2180 を通して ROM内 の 1 つのテーブルから RAM の連続した領域に書き込むことができるということです。 このレジスタの値は、インクリメント時にページ境界をまたぐことはありません。
https://w.atwiki.jp/snesspec/pages/168.html
たくさんの SNES ゲームに実装されている、コピー機を使わせないようにするための FastROM、 PAL/NTSC、 SRAMサイズチェックを迂回する方法について書く。 注:必ずしも全ての文字列を置換する必要はない。 目次 SlowROM チェック PAL/NTSC チェック SRAM サイズチェック SlowROM チェック 新しいカートリッジは、ほとんどがアクセス時間 120ns の ROM を使用しているが、 ROM コピー機では 200ns のものもある。これらの組み合わせでは バックアップした ROM を正しく動作させることができない。 ROM コードの SlowROM チェックを迂回することで、 SlowROM のコピー機でも FastROM のゲームを動作させることができる。 次の文字列を置換することで SlowROM チェックを迂回するようにできる。 検索する値 置換する値 A9 01 8D 0D 42 A9 00 8D 0D 42 A9 01 8E 0D 42 A9 00 8E 0D 42 A2 01 8D 0D 42 A2 00 8D 0D 42 A2 01 8E 0D 42 A2 00 8E 0D 42 A9 01 00 8D 0D 42 A9 00 00 8D 0D 42 A9 01 8F 0D 42 00 A9 00 8F 0D 42 00 PAL/NTSC チェック まだその国で発売されていないゲームを他の国で買ったりすることができないようにするために、 たくさんのゲームでビデオシステムの組み合わせが正しいかを検出するコードが実装されている。 次の文字列を置換することで PAL/NTSC チェックを迂回することができる。 検索する値 置換する値 3F 21 29 10 C9 10 F0 3F 21 29 10 C9 10 80 3F 21 89 10 C9 10 F0 3F 21 89 10 C9 10 80 3F 21 29 10 F0 3F 21 29 10 80 3F 21 00 89 10 F0 3F 21 00 89 10 80 3F 21 00 29 10 F0 3F 21 00 29 10 80 3F 21 89 10 00 F0 3F 21 89 10 00 80 3F 21 29 10 00 F0 3F 21 29 10 00 80 AD 3F 21 29 10 00 D0 AD 3F 21 29 10 00 80 AF 3F 21 00 29 10 D0 AF 3F 21 00 29 10 80 AF 3F 21 00 29 10 00 D0 AF 3F 21 00 29 10 00 EA EA AD 3F 21 29 10 D0 AD 3F 21 29 10 EA EA AD 3F 21 29 10 F0 AD 3F 21 29 10 80 AD 3F 21 89 10 D0 AD 3F 21 89 10 80 AD 3F 21 29 10 C9 00 F0 AD 3F 21 29 10 C9 00 80 AF 3F 21 00 29 10 00 F0 AF 3F 21 00 29 10 00 80 AF 3F 21 00 89 10 00 F0 AF 3F 21 00 89 10 00 80 SRAM サイズチェック いくつかのゲームは、コピー保護のために SRAM のサイズチェックを入れている。 ほとんどのコピー機は、256kbits の SRAM を積んでいる。 新しいコピー機は、このチェックを回避する。 xx は何が入るか分からない箇所で、 括弧に囲まれた範囲は、どちらか一方の値を取る。 検索する値 (8F, 9F) xx xx 70 (CF, DF) xx xx 70 D0 置換する値 (8F, 9F) xx xx 70 (CF, DF) xx xx 70 EA EA (SRAM サイズ = 64kbit の時)(8F, 9F) xx xx 70 (CF, DF) xx xx 70 80 (SRAM サイズ 64kbit の時) 検索する値 (8F, 9F) xx xx (30, 31, 32, 33) (CF, DF) xx xx (30, 31, 32, 33) D0 置換する値 (8F, 9F) xx xx (30, 31, 32, 33) (CF, DF) xx xx (30, 31, 32, 33) 80 検索する値 (8F, 9F) xx xx (30, 31, 32, 33) (CF, DF) xx xx (30, 31, 32, 33) F0 置換する値 (8F, 9F) xx xx (30, 31, 32, 33) (CF, DF) xx xx (30, 31, 32, 33) EA EA 検索する値 (8F, 9F) xx xx (30, 31, 32, 33) AF xx xx (30, 31, 32, 33) C9 xx xx D0 置換する値 (8F, 9F) xx xx (30, 31, 32, 33) AF xx xx (30, 31, 32, 33) C9 xx xx 80
https://w.atwiki.jp/snesspec/pages/150.html
BGモード タイルマップとキャラクタマップ BGスクロール ダイレクトカラーモード [#dc67e4d8] モード 0 モード 1 モード 2 モード 3 モード 4 モード 5 モード 6 モード 7 BGのレンダリング BGモード 7 つの画面モードと、主に 2 つの状態変化がある。 画面モードは、0x2105 のビット 0 ~ 2 で設定できる。 モード 1 の状態変化は 0x2105 のビット 3 で設定でき、 モード 7 の状態変化は 0x2133 のビット 6 で設定できる。 モード BGの色数 1 2 3 4 0 4 4 4 4 1 16 16 4 - 2 16 16 - - 3 256 16 - - 4 256 4 - - 5 16 4 - - 6 16 - - - 7 256 - - - 7 拡張BG 256 128 - - 全てのモードの全てのBGでパレット番号 0 は透明色に設定されている。 タイルマップとキャラクタマップ それぞれのBGはVRAMの2つの領域が関係している。 1つはタイルマップ、もう1つはキャラクタデータに使用される。 タイルマップアドレスはは 0x2107 ~ 0x210a のビット 2 ~ 7 で選択する。 タイルマップのサイズは同じレジスタのビット 0 ~ 1 で選択する。 全てのタイルマップは 32x32 だが、ビット 0 ~ 1 は メモリ上でどのようにレイアウトされるかを指定する。 値 サイズ 内容 00 32x32 AAAA 01 64x32 ABAB 10 32x64 AABB 11 64x64 ABCD タイルマップアドレスの最初の 0x800 (2048) バイトはタイルマップAで、 次の 0x800 バイトが B、C、D というように続く。 Aのみが必要とされる場合、他の場所は空の領域とされる。 タイルマップのそれぞれの項目は 2 バイトで、次のようなフォーマットになっている。 15 14 13 12 11 10 9 8 v h o p p p c c 7 6 5 4 3 2 1 0 c c c c c c c c v/h タイルの垂直/水平反転 o タイルの優先順位 ppp タイルのパレット パレットの色数は画面モードとBGに依存 cccccccccc タイル番号 タイルマップから特定タイルのワードアドレスを見つけるには (X と Y)、 次の式を使う。 (Addr 9) + ((Y 0x1f) 5) + (X 0x1f) + (SY ? ((Y 0x20) (SX ? 6 5)) 0) + (SX ? ((X 0x20) 5) 0) タイルのキャラクタデータは 0x210b ~ 0x210c で指定される場所から始まるアドレスに配置されている。 (Base 13) + (TileNumber * 8*NumBitplanes) それぞれのタイルは通常 8x8 ピクセルのサイズで、ビットプレーンで保存される。 1行はそれぞれ 1 バイトで構成され、一番左端はビット 7 で指定する。 4 色のタイルでは、ビットプレーン 0 と 1 が 1 ワードの下位バイト、 上位バイトとして保存され、8 ワードで 1 つのタイルを構成する。 16 色タイルでは、4 色と同様に 0, 1 が保存され、それに 2, 3 が続くような 形式で保存される。 256 色タイルでは同じ方法で、2 つの 16 色タイルが続くような形式で保存される。 0x2105 でキャラクタサイズが指定された場合、 16x16 ピクセルブロックのタイルとすることができ、1 つのタイルに タイル、タイル + 1、タイル + 16、タイル + 17 が使われる。 この場合、32x32 タイルマップで、通常の 256x256 ピクセルサイズではなく、 512x512 サイズが使われる。 同様に、64x64 タイルマップでは、BG は 1024x1024 ピクセルまで拡張される。 これらは 16x16 スプライトの時のようにラッピング処理がされることはなく、 Tile=0x2ff を指定した場合、0x2ff, 0x300, 0x30f, 0x310 を使うことになる。 もちろん、 0x3FF からは 0x000 に行く。 このモードで反転フラグをセットした場合、個々の 8x8 タイルではなく、 16x16 タイルが反転される。 BGスクロール BG モードとインターレス設定によるが、 モード 0 ~ 6 は 256x224 か 256x239 ピクセルの画面を表示する。 0x210d ~ 0x2114 のスクロールレジスタで、 256x256 ~ 1024x1024 ピクセルの BG の表示領域を調節することができる。 BG を画面外に移動することはできず、 画面外に移動するような設定にした時は単純にラップされる。 (BG を 1024x1024 に設定した場合はどう考えてもできない) 0x210d ~ 0x2114 は全て 2 度書きレジスタで、16ビット値を設定する。 これらのレジスタへ値を書き込んだ場合、その値はバッファに保存される。 これらいずれかのレジスタに新しい値を書き込んだ場合、 現在のレジスタ値と、6バイトのいずれかのレジスタに対して 直前に書き込まれた 1 バイトの値が新しい値と合成されて書き込まれる。 BGnHOFS の場合 (NewByte 8) | (PrevByte ~7) | ((CurrentValue 8) 7) BGnVOFS の場合 (NewByte 8) | PrevByte ほとんどの場合、この詳細は重要ではなく、普通に 1 つのレジスタに 2 度書き込めば 問題は起こらないのだが、いくつかのゲームで 1 度だけ書き込んだり、 他に変なことをしていることがある。 タイルマップエントリからスクリーン上の特定のX,Y座標を計算する時には 次の式を使う。 Size = 8 か 16。0x2105 で指定される TileX = (X + BGnHOFS) / Size TileY = (Y + BGnVOFS) / Size TileX と TileY の位置にあるタイルを検索する。詳細は以下 注 多くのゲームで垂直スクロール位置は 0 ではなく -1 に設定されている。 これは、SNES が OBJ データをスキャンライン毎に 1 つ前の位置を参照するためである。 1番最初の行では、OBJ データは何もロードされていない。 SNESは実際にはスキャンライン0に出力しない。 インターレス画面では、行 0 を無視するために -1 ではなく -2 を指定する必要がある。 (エミュレータでは1の代わりに2を足す必要があるだろう) ダイレクトカラーモード モード 3, 4, 7 の 256 色 BG では、0x2130 のビット 0 に 1 が設定されている時、ダイレクトカラーモードが有効になる。 このモードでは、パレットの指定 ( ppp ) が無視され、 キャラクタデータではパレットインデックスの代わりに BBGGGRRR で表される色を指定する。 3 ビットの ppp は bgr になり、色データの追加分として使われる。 赤 (R) = RRRr0 緑 (G) = GGGg0 青 (B) = BBb00 ダイレクトカラーモードでは黒いピクセルを指定することはできない。 値が 0 のキャラクタデータは透明色として扱われる。 黒を表示するためには、黒に一番近い値を使うと良いだろう。 (01, 08, 09 辺りが良い) モード 0 それぞれ最大 4 色が出る 4 つの BG がある。 パレットエントリの開始位置は次の式で計算できる。 ppp * 4 + (BG# - 1) * 32 表示の優先順位は次の順 (前面から背面へ) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 1 の BG2 優先順位 2 のスプライト 優先順位 0 の BG1 優先順位 0 の BG2 優先順位 1 のスプライト 優先順位 1 の BG3 優先順位 1 の BG4 優先順位 0 のスプライト 優先順位 0 の BG3 優先順位 0 の BG4 モード 1 16 色の BG が 2 面と、4 色の BG が 1 面ある。 パレットエントリの開始位置は次の式で計算できる。 ppp * ncolors 0x2105 のビット 3 の設定によって背景の優先順位は変化する。 表示の優先順位は次の順 (前面から背面へ) 優先順位 1 の BG3 (0x2105 のビット 3 がセットされている時) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 1 の BG2 優先順位 2 のスプライト 優先順位 0 の BG1 優先順位 0 の BG2 優先順位 1 のスプライト 優先順位 1 の BG3 (0x2105 のビット 3 がクリアされている時) 優先順位 0 のスプライト 優先順位 0 の BG3 モード 2 16 色の BG が 2 面ある。 パレットエントリの開始位置は次の式で計算できる。 ppp * 16 表示の優先順位は次の順 (前面から背面へ) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 2 のスプライト 優先順位 1 の BG2 優先順位 1 のスプライト 優先順位 0 の BG1 優先順位 0 のスプライト 優先順位 0 の BG2 モード 2 は、"タイル毎オフセット" を使う最初のモード。 このモードでは、BG3 のタイルデータはエンコードされていて、 BG1, BG2 の両方またはいずれかの、それぞれのタイルの (可能であれば) HOffset, VOffset の両方またはいずれかを 置き換える。 可視状態のスキャンラインについて考えると、 通常、次に示すような方法でピクセルを取得する。 HOFS = X + BGnHOFS VOFS = Y + BGnVOFS Pixel[X,Y] = GetPixel(GetTile(BGn, HOFS, VOFS), HOFS, VOFS) "タイル毎オフセット" の時は、もう少し複雑になる。 HOFS = X + BGnHOFS VOFS = Y + BGnVOFS ValidBit = BG1 の時 0x2000, BG2 の時 0x4000 if (!IsFirst8x8Tile(BGn, HOFS)) { /* この計算は正しいだろうと思うが... */ Hval = GetTile(BG3, (HOFS 7)|(((X-8) ~7)+(BG3HOFS ~7)), BG3VOFS) Vval = GetTile(BG3, (HOFS 7)|(((X-8) ~7)+(BG3HOFS ~7)), BG3VOFS + 8) if (Hval ValidBit) HOFS = (HOFS 7) | ((X ~7) + (Hval ~7)) if (Vval ValidBit) VOFS = Y + Vval } Pixel[X,Y] = GetPixel(Get8x8Tile(BGn, HOFS, VOFS), HOFS, VOFS) 言い換えれば、BGn の 0-32 の可視状態のタイルと、 BG3 の"可視" のタイルは同じになる。 BGn のタイル 0 のオフセットは普通で、 1 = T 33 の範囲にある BGn のタイル T はオフセットデータを BG3 の タイル T - 1 から取得する。 このとき、タイルが実際に配置されているかどうかは問題ではない。 可視の左端のタイルはいつでも通常で (最短、1 ピクセルが可視になるが、 クリップウインドウを使う時にまだ悩むことになるだろう)、 次のタイルは、BG3 の左端のタイルのが何になるかによって、タイルマップエントリを使う。 "新しい"オフセットは BGnVOFS レジスタをオーバーライドするが、 BGnHOFS オフセットの下位 3 ビットはまだ使われるだろう。 スクリーンの現在の Y 座標は BG3 のタイルマップの参照している どの行にも影響しない。Y 座標が常に 0 の時も 一方、たとえ BGn が 16x16 タイルでも、 BG3 は、それぞれ 8x8 サブタイルのオフセットを指定することができる。 BG3 が 16x16 の時、オフセットは関連する BGn の 8x8 サブタイルに適用される。 BG3 が 16x16 の時、Hval と Vval に同じタイルを最後まで使う。 モード 3 このモードは、256 色の BG と 16 色の BG がある。 パレットエントリの開始位置は次の式で計算できる。 BG1 0 BG2 ppp*16 表示の優先順位は次の順 (前面から背面へ) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 2 のスプライト 優先順位 1 の BG2 優先順位 1 のスプライト 優先順位 0 の BG1 優先順位 0 のスプライト 優先順位 0 の BG2 注 0x2130 レジスタで、BG1 をダイレクトカラーモードに設定できる。 モード 4 このモードは、256 色の BG と 4 色の BG がある。 パレットエントリの開始位置は次の式で計算できる。 BG1 0 BG2 ppp*4 表示の優先順位は次の順 (前面から背面へ) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 2 のスプライト 優先順位 1 の BG2 優先順位 1 のスプライト 優先順位 0 の BG1 優先順位 0 のスプライト 優先順位 0 の BG2 注 0x2130 レジスタで、BG1 をダイレクトカラーモードに設定できる。 モード 4 は、 "タイル毎オフセット" を使う、2 番目のモード。 モード 2 と同じように機能する。 しかし SNES には、2つのオフセット値をロードする時間がないので、 代わりに次のような処理を行う。 Val = GetTile(BG3, ...) if (Val 0x8000) { Hval = 0 Vval = Val } else { Hval = Val Vval = 0 } モード 5 このモードは、16 色の BG と 4 色の BG がある。 パレットエントリの開始位置は次の式で計算できる。 ppp * ncolors 表示の優先順位は次の順 (前面から背面へ) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 2 のスプライト 優先順位 1 の BG2 優先順位 1 のスプライト 優先順位 0 の BG1 優先順位 0 のスプライト 優先順位 0 の BG2 このモードは、これまでのモードと違う点が多々ある。 通常の 8/16 ピクセル幅のタイルを使う代わりに、 常に 16 ピクセル幅のタイルを使う (高さは 8 または 16 ピクセル)。 それから、ピクセル列の半分だけ使用する。 (0ベースで、偶数番号のピクセルはサブスクリーンに、 奇数番号のピクセルはメインスクリーンのタイルに使用される) そして、スクリーンを仮想的に 512 ピクセル幅で表示する。 同様に、インターレスモードが ON (0x2133 参照) の時、 224 か 239 の高さの代わりに、448 か 478 の高さを使う。 0x213F のビット 7 の指定で、偶数ラインと奇数ラインを交互に表示する。 注 ここに書いたように表示するには、 0x212C と 0x212D で同じ値を指定しなければならない。 モード 6 このモードでは、16 色の BG のみを使う。 パレットエントリの開始位置は次の式で計算できる。 ppp * ncolors 表示の優先順位は次の順 (前面から背面へ) 優先順位 3 のスプライト 優先順位 1 の BG1 優先順位 2 のスプライト 優先順位 1 のスプライト 優先順位 0 の BG1 優先順位 0 のスプライト このモードは、モード 5 と同じように動作する。 また、 "タイル毎オフセット" の機能も追加される。 こちらはモード 2 のように動作する。 しかし、モード 6 では 8 ピクセル幅 (16 ハーフピクセル) のタイルが使用され、 BG3 も BG1 と同じようにこれが適応される。 8 ハーフピクセルにも 16 ピクセル幅の領域にも オフセットを適用することはできない。 (2 つの 8 ピクセル領域に 2 つのオフセット値を使う時は除く) モード 7 このモードは、他のモードと極端に違う。 256色のBGが1面あるが、タイルマップとキャラクタマップの 配置の仕方は全く異なる。 タイルマップとキャラクタマップは重なっており、 BGのレンダリング 水平・垂直オフセットを取得 (それぞれレジスタから取得するか、"タイル毎オフセット" により計算される) これらの値をプレイ画面に変換する 注 モード 7 ではこの工程がかなり複雑 座標に合わせてタイルマップを取得する タイルマップを使ってキャラクタデータを取得する 必要であれば、画像を非ビットプレーンに展開してバッファに格納する 詳細は画面のレンダリング参照
https://w.atwiki.jp/snesspec/pages/260.html
0x2133 - SETINI (スクリーンモード/ビデオ設定) アクセスフラグ 書バ強VH- 7 6 5 4 3 2 1 0 s e - - p o I i s 外部同期 "sfx" グラフィックスのスーパーインポーズに使用します。 通常は 0 です。このビットについて他に分かることはありません。 SPPU1 チップには "EXTSYNC" (または not-EXTSYNC) というピンがあり、 これは Vcc に繋げられています。 e モード 7 拡張BG このビットがセットされている時、モード 7 の BG2 が有効になります。 BG2は、BG1と同じタイルとキャラクタデータを使用しますが、 色データの上位ビットは、ピクセルの優先順位として解釈されます。 様々なところで、このビットがビット 7 にも関連している 可能性があると報告されています。 例えば、「外部LSIからのデータ供給有効」というようなものです。 これはもちろん勘違いだと思います。 p 擬似ハイレゾモード有効 サブスクリーンから(ゼロベースで)偶数番号のピクセルを、 メインスクリーンから奇数番号のピクセルを取得することで 水平方向に512ピクセルの解像度を作ります。 カラーマスはモード5/6の時と同じように動作します。 インターレスビットは影響を受けません。 モザイクは通常通り動作します(モード5/6のようにではなく)。 ウインドウによってサブスクリーンはクリッピングされ、 メインスクリーンの左側もクリッピングされます。 右側は想像通りにはクリッピングされません。 ピクセル列 0 はどうなるのか分かりません。 モード 5/6 の時にこのビットをセットしても変更はありません。 o オーバースキャンモード 1の時、通常の 224 行に代わって、239 行が画面に表示されます。 これは、V-Blank の開始が遅れることと、期間が短くなることを意味します。 スクリーンに追加された行はTVに表示されますが、 8ピクセル分上に移動します。 I OBJ インターレス 1の時、BGモードに関係なく、OBJがインターレスモードになり、 半分の高さで表示されます。(ビット 0 参照) これは、OBJが通常通り描画されるかそうでないかだけを設定します。 TVに対するインターレス信号の出力は下記のビット 0 で指定します。 i スクリーンインターレス 1の時、モード 5 (多分6も) の BG の スクリーンが 224 (または 239) ではなく、 448 (または 478) ピクセルになります。 他のモードでこのフラグをセットすると、1 ピクセルずつ飛び飛びに表示されます。 タイルマップのそれぞれの項目は、位置を変えることで 高くなったスクリーンを表現します。 (擬似ハイレゾモードのような動作) また、ハードウェアの方は、 SNES の画面を 普通のインターレス信号で出力するようになります。 オーバースキャンフラグについての注意: 通常の NMI トリガーポイントの前に、これを 0xE0 (224) 行に変更した場合、 フレーム中ずっとこれを設定したような意味になってしまいます。 これは NMI トリガーポイントとHDMA の停止に影響します。 (訳注:NMIトリガーについて調べた後、もっかいきちんと読んで修正します。) 一番初めの方のスキャンライン "X" (0xE1 = X = 0xF0) でオーバースキャンを 0 にすると、 NMI が X 行で発生し、最後の HDMA 転送が X-1 行で起こります。 表示領域は普通のオーバースキャンでないモードと同じ 0xE1 ~ 0xEC の位置に残り、 0xED の1ピクセルだけ上の位置に移動します。 そして、0xEF ~ 0xF4 で 垂直同期を失います。 行 0xE1 (225) でフラグをオンにした場合、 NMI が 0xE2 (226) 行で発生し、 0xE0 行で起こった最後のHDMAがまだ発生している。 いつでもフラグをオフにした時には他に何かが起こるが、 スキャンラインの開始から十分時間が経過した後では 何も起こらない。 何も画面変化が起こらない場合でも、 オーバースキャンの設定はVRAMの書き込みに影響を及ぼす。 0xE1(225) ~ 0xF0(240) の間に、 以下のようなコードを実行すると、 LDA # - STA $2118 LDA r2133 STA $2133 LDA # + STA $2118 オーバースキャンフラグが 0 か、 1 かによって、 VRAMには + のみ、または - のみが書き込まれる。
https://w.atwiki.jp/snesspec/pages/19.html
これは、SNES にのみ適用可能なメモリマップである。 "LoROM", "HiROM" 等の異なる種類のカートリッジが アドレスバス A に配置される。 カートリッジは、/CART 信号がアクティブな時に反応する。 どちらのバスのアドレスにも反応できるが、 片方はマップされない。 同様に、拡張ポートにデバイスが接続された時、 アドレスバス B の何もマップされていないレジスタに反応するだろう。 WRAM は、/WRAM 信号がアクティブな時はアドレスバス A に、 レジスタ 0x2180 ~ 0x2183 を通してアドレスバス B に配置される。 APU は、アドレスバス B の 0x40 ~ 0x7F に配置される。 PPU1 と PPU2 は、アドレスバス B の 0x2100 ~ 0x213F に配置される。 表の、"スピード" 列はその領域のメモリのアクセス速度を表す。 SNES のマスタークロックは約 21MHz である (おそらく、1.89e9/88 Hz に近い)。 CPU の内部動作サイクルは常に 6 マスターサイクルで、 Fast メモリアクセスサイクルは 6 マスターサイクル、 Slow メモリアクセスサイクルは 8 マスターサイクル、 XSlow メモリアクセスサイクルは 12 マスターサイクルかかる。 バンク アドレス スピード マッピング $00-$3F $0000-$1FFF Slow アドレスバス A + /WRAM (ミラー $7E 0000-$1FFF) $2000-$20FF Fast アドレスバス A $2100-$21FF Fast アドレスバス B $2200-$3FFF Fast アドレスバス A $4000-$41FF XSlow 内部CPUレジスタ (注 1 参照) $4200-$43FF Fast 内部CPUレジスタ (注 1 参照) $4400-$5FFF Fast アドレスバス A $6000-$7FFF Slow アドレスバス A $8000-$FFFF Slow アドレスバス A + /CART $40-$7D $0000-$FFFF Slow アドレスバス A + /CART $7E-$7F $0000-$FFFF Slow アドレスバス A + /WRAM $80-$BF $0000-$1FFF Slow アドレスバス A + /WRAM (ミラー $7E 0000-$1FFF) $2000-$20FF Fast アドレスバス A $2100-$21FF Fast アドレスバス B $2200-$3FFF Fast アドレスバス A $4000-$41FF XSlow 内部CPUレジスタ (注 1 参照) $4200-$43FF Fast 内部CPUレジスタ (注 1 参照) $4400-$5FFF Fast アドレスバス A $6000-$7FFF Slow アドレスバス A $8000-$FFFF 注 2 アドレスバス A + /CART $C0-$FF $0000-$FFFF 注 2 アドレスバス A + /CART 注 1 内部 CPU レジスタ用のアドレスは、 アドレスバス A の外にある可能性があり、 CPU はデータバスを無視する。 データバスが全てのメモリ領域を無視するかということと、 これらのアドレスが実際にレジスタなのかは不明。 同様に、CPU の書き込みがデータバスに現れるのかどうかも不明。 現在のところ、アドレスと書き込みはバスに現れるだろうと 考えられている。読み込みは現れたり現れなかったりする。 実際にマップされているレジスタのビットのみがデータバスで無視される。 (例えば、データバスは 0x4211 のビット 7 だけを無視する) 注 2 CPU レジスタ 0x420D のビット 0 がセットされている時、 スピードは Fast になり、セットされていない場合は Slow になる。 Mode 20 LoROM メモリモデル (32k バンク) - 最大 24Mbit バンク アドレス 内容 ミラーバンク 0x00-0x2F 0x0000-0x1FFF 下位RAM 0x7E 0x2000-0x2FFF I/Oポート (PPU1, APU) 0x00-0x3F 0x3000-0x3FFF I/Oポート (SFX, DSP, etc) 0x00-0x3F 0x4000-0x41FF I/Oポート (PAD) 0x00-0x3F 0x4200-0x5FFF I/Oポート (PPU2, DMA, etc) 0x00-0x3F 0x6000-0x7FFF 予約済み 0x00-0x3F 0x8000-0xFFFF Mode 20 ROM 0x30-0x3F 0x0000-0x1FFF 下位RAM 0x7E 0x2000-0x2FFF I/Oポート (PPU1, APU) 0x00-0x3F 0x3000-0x3FFF I/Oポート (SFX, DSP, etc) 0x00-0x3F 0x4000-0x41FF I/Oポート (PAD) 0x00-0x3F 0x4200-0x5FFF I/Oポート (PPU2, DMA, etc) 0x00-0x3F 0x6000-0x7FFF 予約済み 0x8000-0xFFFF Mode 20 ROM 0x80-0xBF 0x40-0x5F 0x0000-0x7FFF 予約済み 0x8000-0xFFFF Mode 20 ROM 0xC0-0xEF 0x60-0x6F 0x0000-0x7FFF 予約済み 0x70-0x77 0x0000-0x7FFF Mode 20 SRAM (256Kバイト) 0x8000-0xFFFF 予約済み 0x78-0x7D 0x0000-0xFFFF 予約済み 0x7E 0x0000-0x1FFF 下位RAM 0x00-0x3F 0x2000-0x7FFF 上位RAM 0x8000-0xFFFF 拡張RAM 0x7F 0x0000-0xFFFF 拡張RAM 0x80-0xDF 0x0000-0xFFFF バンク0x00-0x5Fのミラー 0x00-0x5F 0xE0-0xFF 0x0000-0xFFFF 予約済み Mode 21 HiROM メモリモデル (64k バンク) - 最大 48Mbit バンク アドレス 内容 ミラーバンク 0x00-0x2F 0x0000-0x1FFF 下位RAM 0x7E 0x2000-0x2FFF I/Oポート (PPU1, APU) 0x00-0x3F 0x3000-0x3FFF I/Oポート (SFX, DSP, etc) 0x00-0x3F 0x4000-0x41FF I/Oポート (PAD) 0x00-0x3F 0x4200-0x5FFF I/Oポート (PPU2, DMA, etc) 0x00-0x3F 0x6000-0x7FFF 予約済み 0x00-0x3F 0x8000-0xFFFF Mode 21 ROM (0xC0-0xEFより) 0xC0-0xEF 0x30-0x3F 0x0000-0x1FFF 下位RAM 0x7E 0x2000-0x2FFF I/Oポート (PPU1, APU) 0x00-0x3F 0x3000-0x3FFF I/Oポート (SFX, DSP, etc) 0x00-0x3F 0x4000-0x41FF I/Oポート (PAD) 0x00-0x3F 0x4200-0x5FFF I/Oポート (PPU2, DMA, etc) 0x00-0x3F 0x6000-0x7FFF Mode 21 SRAM (128Kバイト) 0x8000-0xFFFF Mode 21 ROM (0xF0-0xFFより) 0xF0-0xFF 0x40-0x5F 0x0000-0xFFFF Mode 21 ROM 0x60-0x6F 0x0000-0x7FFF 予約済み 0x70-0x77 0x0000-0x7FFF Mode 20 SRAM (256Kバイト) 0x8000-0xFFFF 予約済み 0x78-0x7D 0x0000-0xFFFF 予約済み 0x7E 0x0000-0x1FFF 下位RAM 0x00-0x3F 0x2000-0x7FFF 上位RAM 0x8000-0xFFFF 拡張RAM 0x7F 0x0000-0xFFFF 拡張RAM 0x80-0xBF 0x0000-0xFFFF バンク0x00-0x3Fのミラー 0x00-0x3F 0xC0-0xFF 0x0000-0xFFFF Mode 21 ROM SPC 700 アドレス 内容 0x0000-0x00EF RAM 0x00F0-0x00FF I/Oポート (DSP) 0x0100-0x7FFF RAM 0x8000-0xFFBF RAM? 0xFFC0-0xFFFF ROM(起動用)
https://w.atwiki.jp/gamemusicbest100/pages/9337.html
Forest (SNES Homebrew Music Album) 機種:SFC 作曲・編曲者:Y.Sato 開発・配布元:Y.Sato(Niigata Repuru Channel) 公開年:2021 ※無料配布 概要 動画「スーパーファミコン実機でオリジナル曲「鍵の眠る森」を演奏」や、「NHKエレうた ver.0.1!」の「北方の平原にて」などで知られる、Y.Sato氏によるスーパーファミコンの内蔵音源を使用したアルバム。(どちらの曲もこのアルバムに収録。) ドライバは、eKid(Mukunda Johnson)氏作のXMSNESが使われている。 SPCファイルで配布が行われており、スーファミをMIDIシンセサイザー化するゲームカートリッジ型ガジェット"Super MIDI Pak"を使用して実機再生を実現する形がとられている。また、SoundcloudやBOOTHで実機録音のデータがフルで公開されている上に、これと同じ内容の音楽CD(プレス版)も出版されている。 この他、作者自らの手により作られたSFメモリカセットを使ったカートリッジ版も存在し、レトロゲーム関連のイベントで展示・実演されたこともあるが、あくまで個人的な実験で作ったものであり、量産・頒布の予定はないとのことである。但し、すぐ書き込みができるイメージファイルは公開されており、カートリッジと機器さえあれば簡単に作れるようになっている。 同系統の他作品と比べてやや影の薄いアルバムシリーズであったが、作品に関するツイートを著名人がリツイートやいいねをしたことにより、広く知られる結果となった。 このアルバムは2作目であり、前作は2011年公開の「Message for Peace(希望へ導くメッセージ)」である。 収録曲 曲名 備考 順位 鍵の眠る森 オリジナル 天国と地獄 クラシック(Jacques Offenbach作曲) 素晴らしき牛の国 オリジナル(UNIX版牛丼道 タイトルBGM) 長い道を ロシア民謡(ジプシーソング)Digital Foundry - DF Direct Weekly #49 Introductions BGM 生きている湖底の村落 オリジナル 北方の平原にて オリジナル(NHKエレうた ver.0.1! オンエア曲)※スーファミの音源で演奏したインスト版を収録 戻らない時間 オリジナル(動画「DS内蔵音源でオリジナル曲を演奏してみた」の曲) アルハンブラ宮殿の思い出 クラシック(Francisco Tarrega作曲) 鍵の眠る森 桃音モモバージョン オリジナル(CV:藤本萌々子) 花 唱歌(瀧廉太郎作曲) サウンドトラック
https://w.atwiki.jp/snesspec/pages/26.html
2つのコントローラポートと、底面に1つの拡張端子がある。 コントローラポートに繋ぐものとして次のような種類がある。 ジョイパッド マルチタップ (MP5) コントローラを追加で4つまで繋げられるようにする 2 ボタンマウス スーパースコープ (バズーカの形のガンコントローラ) ガンコントローラ (Justifiers) コントローラポート 注 図は海外版のものかもしれません。 ここに書かれている情報を元にしてコントローラポートに繋ぐ ハードウェアを作ろうとしないでください。 1 +5v (power) 2 Clock 3 Latch 4 Data1 5 Data2 6 IOBit 7 Ground 何も接続されていない時は、Data1, Data2 の読み込みデータが 0 になる。 ジョイパッド ジョイパッド (普通のコントローラ) は、 Data1 から 16ビットのデータを返す。 ラッチされる度に順番はクリアされる(?) byetUDLRaxlr0000 b/y/a/x/l/r はボタンの記号と同じ。 e はセレクト、 t はスタート。 U/D/L/R は十字キー。 普通のコントローラでは、十字キーの上と下、左と右は同時に押せなくなっている。 いくつかのゲームでは、これらの組み合わせで同時に押した場合、 クラッシュするか、動作がおかしくなる。 Data2, IOBit は接続されていない。 マウス マウスは、Data1 から 32ビットのデータを返す。 00000000rlss0001 YyyyyyyyXxxxxxxx l/r はマウスのボタンを表す。 ss はスピードビットで、ラッチがアクティブになっていた間のクロック数を mod 3 して返す。 Y/X は方向ビット。セットされていたら上または左。 yyyyyyy/xxxxxxx はその方向への距離。 Data2, IOBit はたぶん接続されていない。 スーパースコープ スーパースコープは Data1 から 8 ビットのデータを返す。 データ列 fctp00on f は Fire、 c は Cursor、 t は Turbo、 p は Pause、 o は Offscreen、 n は Noise を指す。 スーパースコープには 2 つのモードがある。 ガンコントローラ (Justifiers) Justifier は Data1 から 48 ビットのデータを返す。 32 ビットのデータの後に 16 個の 1 を返す。 しかし、これは何か分からない。 データの順番 0000000000001110 01010101TtSsl000 1111111111111111 T/t はプレイヤー 1 / 2 のトリガーの状態を表す。 S/s はプレイヤー 1 / 2 のスタートボタンの状態を表す。 l は、どちらの銃が IOBit に接続されているのかを表し、 1 は銃 1 を、 0 は 銃 2 を指す。 l は、銃 2 が接続されていない時は反転する。 IOBit は スーパースコープのように使う。 しかし、2 個の銃が 1 つのポートに接続され、 どちらの銃が IOBit に接続されているかは Latch の度に変更される。 Justifier は Latch の前にトリガーが引かれるのを待たない。 電子銃が検知される度に Latch される。 Justifier がスクリーンに向いているか向いていないかを決定するために 0x213F のビット 6 が使用される 。 Data2 はたぶん接続されていないが、確実なことは分からない。 マルチタップ (MP5) MP5 をSNESのコントローラポート (通常、ポート 2) に接続し、 4 つのコントローラをそこに接続することができる (2 ~ 5)。 IOBit が 1 の場合、Clock はパッド 2 と 3 を通る。 Data1 はパッド 2 の Data1 へ、 Data2 はパッド 3 の Data1 へそれぞれ接続される。 IOBit が 0 の場合、パッド 4 と 5 を使う。 どちらの場合も、Latch は全てのポートに通される。 たぶん、 IOBit は全てに通されることはない。 Clock は IOBit で選択されたところにのみ信号を通す。 最初の 2 つのパッドのみ読み込むことができ (自動ジョイパッド読み込みもそのようにする)、 IOBit を切り替えた時に他のパッドを手動で読み込むことができる。 たくさんのゲームで、3 人より多くのプレーヤーの処理の時に このようなことが行われている。 MP5 はポート 1 にも接続することができるが、 IOBit のセット用に、 0x4201 のビット 6 をビット 7 の代わりに 使用する必要があり、ポート 1 のレジスタを ポート 2 の代わりに使用する必要もある。 2 つの MP5 を使用すると、8 人用のゲームを作ることもできる。 Latch がアクティブな時、Data2 からは 1 が、 Data1 からは 0 が読み込まれる。 MP5 の存在を検出するためにこの動作が使われることがある。 MP5 によって、この動作がオーバーライドされる。 IOBit が 0 から 1 に移行する場合、MP5 がすぐに反応しない。 2 と 3 を読んでから、4 と 5 を読むようにする方が、 逆の場合よりも良いだろう。